#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=110;
int f[maxn][maxn],w[maxn],v[maxn];
int n,m;
int max(int x,int y)
{
	return x>y?x:y;
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int s,nn;
		for(int i=1;i<=n;i++)
			for(int j=0;j<=m;j++)f[i][j]=-1;
		memset(f[0],0,sizeof(f[0]));
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&nn,&s);
			for(int t=1;t<=nn;t++)
				scanf("%d%d",&w[t],&v[t]);
			if(s==0||s==2)
			{
				for(int t=1;t<=nn;t++)
					for(int j=m;j>=0;j--)
					{
						if(s==2)f[i][j]=max(f[i-1][j],f[i][j]);
						if(j-w[t]>=0)
						{
							if(f[i][j-w[t]]!=-1&&f[i][j]<f[i][j-w[t]]+v[t])
								f[i][j]=f[i][j-w[t]]+v[t];
							if(f[i-1][j-w[t]]!=-1&&f[i][j]<f[i-1][j-w[t]]+v[t])
							f[i][j]=f[i-1][j-w[t]]+v[t];

						}
				}
			}
			else
			{
				for(int j=m;j>=0;j--)
				{
					f[i][j]=f[i-1][j];
					for(int t=1;t<=nn;t++)
						if(j-w[t]>=0&&f[i-1][j-w[t]]!=-1)
						f[i][j]=max(f[i][j],f[i-1][j-w[t]]+v[t]);
				}
			}
		}
		cout<<f[n][m]<<endl;
	}
	return 0;
}

			




